﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Net.Mail;
using System.Configuration;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Crosland.Framework.Base;

namespace Crosland.Util
{
    public class Tools
    {


        /// <summary>
        /// Permite enviar correos
        /// </summary>
        /// <param name="mails"></param>
        /// <param name="subject"></param>
        /// <param name="file"></param>
        /// <param name="mensaje"></param>
        /// <param name="remitente"></param>
        public static void SendEmail(List<String> mails, string subject, string mensaje, string remitente, List<String> mailscc)
        {
            try
            {

                MailMessage correo = new MailMessage();

                correo.From = new MailAddress(remitente);
                int contador = 0;
                int contadorcc = 0;

                foreach (string mail in mails)
                {
                    if (!string.IsNullOrEmpty(mail))
                    {
                        correo.To.Add(mail);
                        contador++;
                    }
                }

                if (mailscc != null)
                {

                    foreach (string mailcc in mailscc)
                    {
                        if (!string.IsNullOrEmpty(mailcc))
                        {
                            correo.CC.Add(mailcc);
                            contadorcc++;
                        }
                    }
                }


                if (contador > 0)
                {
                    correo.Subject = subject;
                    correo.Body = mensaje;
                    correo.IsBodyHtml = true;
                    correo.Priority = MailPriority.Normal;

                    SmtpClient smtp = new SmtpClient();
                    smtp.Host = ConfigurationManager.AppSettings["EmailServer"];

                    smtp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["UserNameSMTP"],
                        ConfigurationManager.AppSettings["PasswordSMTP"]);

                    smtp.Send(correo);

                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Permite enviar correos iuncluyendo archivos adjuntos
        /// </summary>
        /// <param name="mails"></param>
        /// <param name="subject"></param>
        /// <param name="file"></param>
        /// <param name="mensaje"></param>
        /// <param name="remitente"></param>
        public static void SendEmail(List<String> mails, string subject, string mensaje, string remitente, 
            List<String> mailscc, List<String> files)
        {
            try
            {

                MailMessage correo = new MailMessage();

                correo.From = new MailAddress(remitente);
                int contador = 0;
                int contadorcc = 0;

                foreach (string mail in mails)
                {
                    if (!string.IsNullOrEmpty(mail))
                    {
                        correo.To.Add(mail);
                        contador++;
                    }
                }

                if (mailscc != null)
                {

                    foreach (string mailcc in mailscc)
                    {
                        if (!string.IsNullOrEmpty(mailcc))
                        {
                            correo.CC.Add(mailcc);
                            contadorcc++;
                        }
                    }
                }


                if (contador > 0)
                {
                    correo.Subject = subject;
                    correo.Body = mensaje;
                    correo.IsBodyHtml = true;
                    correo.Priority = MailPriority.Normal;

                    SmtpClient smtp = new SmtpClient();
                    smtp.Host = ConfigurationManager.AppSettings["EmailServer"];

                    smtp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["UserNameSMTP"],
                        ConfigurationManager.AppSettings["PasswordSMTP"]);


                    foreach (string file in files)
                    {
                        string archivo = ConfigurationManager.AppSettings["RutaArchivo"] + file;
                        Attachment data = new Attachment(archivo, System.Net.Mime.MediaTypeNames.Application.Octet);
                        System.Net.Mime.ContentDisposition disposition = data.ContentDisposition;
                        disposition.CreationDate = System.IO.File.GetCreationTime(file);
                        correo.Attachments.Add(data);
                        //data.Dispose();
                    }

                    smtp.Send(correo);

                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }


        /// <summary>
        /// Convierte un decimal a formato cadena en formato de moneda
        /// </summary>
        /// <param name="numero"></param>
        /// <returns></returns>
        public static string ToMoneyFormat(decimal numero)
        {
            return numero.ToString("N", CultureInfo.InvariantCulture);
        }


        /// <summary>
        /// Covierte un numero en texto
        /// </summary>
        /// <param name="numero"></param>
        /// <returns></returns>
        public static string ConvertToLetters(string numero, string codMoneda)
        {

            string res, dec = "";
            Int64 entero;
            int decimales;
            double nro;

            try
            {
                nro = Convert.ToDouble(numero);
            }
            catch
            {
                return "";
            }

            entero = Convert.ToInt64(Math.Truncate(nro));
            decimales = Convert.ToInt32(Math.Round((nro - entero) * 100, 2));

            dec = " CON " + decimales.ToString() + "/100";

            res = toText(Convert.ToDouble(entero)) + dec;


            if (codMoneda == "01")
            {
                res = res + " NUEVOS SOLES";
            }
            if (codMoneda == "02")
            {
                res = res + " DOLARES AMERICANOS";
            }


            return res;

        }

        private static string toText(double value)
        {

            string Num2Text = "";
            value = Math.Truncate(value);
            if (value == 0) Num2Text = "CERO";
            else if (value == 1) Num2Text = "UNO";
            else if (value == 2) Num2Text = "DOS";
            else if (value == 3) Num2Text = "TRES";
            else if (value == 4) Num2Text = "CUATRO";
            else if (value == 5) Num2Text = "CINCO";
            else if (value == 6) Num2Text = "SEIS";
            else if (value == 7) Num2Text = "SIETE";
            else if (value == 8) Num2Text = "OCHO";
            else if (value == 9) Num2Text = "NUEVE";
            else if (value == 10) Num2Text = "DIEZ";
            else if (value == 11) Num2Text = "ONCE";
            else if (value == 12) Num2Text = "DOCE";
            else if (value == 13) Num2Text = "TRECE";
            else if (value == 14) Num2Text = "CATORCE";
            else if (value == 15) Num2Text = "QUINCE";
            else if (value < 20) Num2Text = "DIECI" + toText(value - 10);
            else if (value == 20) Num2Text = "VEINTE";
            else if (value < 30) Num2Text = "VEINTI" + toText(value - 20);
            else if (value == 30) Num2Text = "TREINTA";
            else if (value == 40) Num2Text = "CUARENTA";
            else if (value == 50) Num2Text = "CINCUENTA";
            else if (value == 60) Num2Text = "SESENTA";
            else if (value == 70) Num2Text = "SETENTA";
            else if (value == 80) Num2Text = "OCHENTA";
            else if (value == 90) Num2Text = "NOVENTA";
            else if (value < 100) Num2Text = toText(Math.Truncate(value / 10) * 10) + " Y " + toText(value % 10);

            else if (value == 100) Num2Text = "CIEN";
            else if (value < 200) Num2Text = "CIENTO " + toText(value - 100);
            else if ((value == 200) || (value == 300) || (value == 400) || (value == 600) || (value == 800)) Num2Text = toText(Math.Truncate(value / 100)) + "CIENTOS";

            else if (value == 500) Num2Text = "QUINIENTOS";
            else if (value == 700) Num2Text = "SETECIENTOS";
            else if (value == 900) Num2Text = "NOVECIENTOS";
            else if (value < 1000) Num2Text = toText(Math.Truncate(value / 100) * 100) + " " + toText(value % 100);
            else if (value == 1000) Num2Text = "MIL";
            else if (value < 2000) Num2Text = "MIL " + toText(value % 1000);

            else if (value < 1000000)
            {
                Num2Text = toText(Math.Truncate(value / 1000)) + " MIL";
                if ((value % 1000) > 0) Num2Text = Num2Text + " " + toText(value % 1000);
            }

            else if (value == 1000000) Num2Text = "UN MILLON";
            else if (value < 2000000) Num2Text = "UN MILLON " + toText(value % 1000000);

            else if (value < 1000000000000)
            {

                Num2Text = toText(Math.Truncate(value / 1000000)) + " MILLONES ";
                if ((value - Math.Truncate(value / 1000000) * 1000000) > 0) Num2Text = Num2Text + " " + toText(value - Math.Truncate(value / 1000000) * 1000000);

            }
            else if (value == 1000000000000) Num2Text = "UN BILLON";
            else if (value < 2000000000000) Num2Text = "UN BILLON " + toText(value - Math.Truncate(value / 1000000000000) * 1000000000000);

            else
            {
                Num2Text = toText(Math.Truncate(value / 1000000000000)) + " BILLONES";
                if ((value - Math.Truncate(value / 1000000000000) * 1000000000000) > 0) Num2Text = Num2Text + " " + toText(value - Math.Truncate(value / 1000000000000) * 1000000000000);
            }
            return Num2Text;

        }


        /// <summary>
        /// Convierte una fecha a letras
        /// </summary>
        /// <param name="fecha"></param>
        /// <returns></returns>
        public static string ConvertDateToLetters(DateTime fecha)
        {
            string[] meses = { "Enero", "Febreo", "Marzo", "Abril", "Mayo", "Junio",
                                 "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre" };

            int dia = fecha.Day;
            int mes = fecha.Month;
            int anio = fecha.Year;


            return dia + " de " + meses[mes - 1] + " del " + anio;
        }



        /// <summary>
        /// Permite generar un color 
        /// </summary>
        /// <param name="indice"></param>
        /// <returns></returns>
        public static string GenerarColor(int indice)
        {
            string[] colores = {   
                "4572A7",
                "89A54E",
                "AA4643",
                "71588F",
                "4198AF",
                "DB843D",
                "AFD8F8",
                "F6BD0F",
                "8BBA00",
                "FF8E46",
                "008E8E",
                "D64646",
                "8E468E",
                "588526",
                "B3AA00",
                "008ED6",
                "9D080D",
                "A186BE",
                "000000",
                "5A5A5A",
                "1080C0",
                "DCBD10"                  
            };

            return colores[indice];
        }


        /// <summary>
        /// Valida si el correo del cliente es válido
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        private static bool ValidarEmail(string email)
        {
            string expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0) return true;
                else return false;
            }
            else return false;
        }

        /// <summary>
        /// Permite validar un texto alfanumerico
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        public static bool ValidarAlfanumerico(string texto)
        {
            char[] testArr = texto.ToCharArray();
            for (int i = 0; i < testArr.Length; i++)
            {
                if (!char.IsLetter(testArr[i]) && !char.IsNumber(testArr[i]) && !char.IsSeparator(testArr[i])
                    &&  !char.IsPunctuation(testArr[i]))
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// Permite validar un texto alfanumerico
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        private static bool ValidarNumero(string texto)
        {
            char[] testArr = texto.ToCharArray();
            for (int i = 0; i < testArr.Length; i++)
            {
                if (!char.IsNumber(testArr[i]))
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// Permite validar un texto alfanumerico
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        private static bool ValidarLetra(string texto)
        {
            char[] testArr = texto.ToCharArray();
            for (int i = 0; i < testArr.Length; i++)
            {
                if (!char.IsLetter(testArr[i]))
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// Permite validar un texto alfanumerico
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        private static bool ValidarMonto(string texto)
        {
            return true;
        }

        /// <summary>
        /// Permite validar un campo
        /// </summary>
        /// <param name="control">Control a validar</param>
        /// <param name="nombreCampo">Nombre del campo a validar</param>
        /// <param name="flagObligatorio">Indica si el campo es obligatorio</param>
        /// <param name="tipoValidacion">Tipo de validacion a aplicar</param>
        /// <returns></returns>
        public static string ValidarCampo(Control control, string nombreCampo, bool flagObligatorio,  TipoValidacion tipoValidacion)
        {
            StringBuilder msg = new StringBuilder();

            if (control is TextBox)
            {
                bool flag = true;
                if (flagObligatorio)
                {
                    if (string.IsNullOrEmpty(((TextBox)control).Text))
                    {
                        msg.Append(string.Format("Se requiere ingresar el campo {0} \n", nombreCampo));
                        flag = false;
                    }
                }
                if (tipoValidacion == TipoValidacion.Alfanumerico && flag)
                {
                    if (!ValidarAlfanumerico(((TextBox)control).Text))
                    {
                        msg.Append(string.Format("El campo {0} solo debe contener números y letras \n", nombreCampo));
                    }
                }
                if (tipoValidacion == TipoValidacion.Email && flag)
                {
                    if (!string.IsNullOrEmpty(((TextBox)control).Text))
                    {
                        if (!ValidarEmail(((TextBox)control).Text))
                        {
                            msg.Append(string.Format("El campo {0} no es válido \n", nombreCampo));
                        }
                    }
                }
                if (tipoValidacion == TipoValidacion.Numero && flag)
                {
                    if (!ValidarNumero(((TextBox)control).Text))
                    {
                        msg.Append(string.Format("El campo {0} debe ser un número \n", nombreCampo));
                    }
                }
                if (tipoValidacion == TipoValidacion.SoloLetras && flag)
                {
                    if (!ValidarLetra(((TextBox)control).Text))
                    {
                        msg.Append(string.Format("El campo {0} solo debe contener letras \n", nombreCampo));
                    }
                }
                if (tipoValidacion == TipoValidacion.Monto && flag)
                {
                    if (!ValidarMonto(((TextBox)control).Text))
                    {
                        msg.Append(string.Format("El campo {0} debe tener el formato de número \n", nombreCampo));
                    }
                }
            }

            if (control is ComboBox)
            {
                if (!(((ComboBox)control).SelectedIndex >= 1))
                    msg.Append(string.Format("Se requiere seleccionar un {0} \n", nombreCampo));
            }

            if (msg.Length > 0) return msg.ToString();

            return string.Empty;
        }


        /// <summary>
        /// Permite validar la seleccion de almenos un item del checkedboxlist
        /// </summary>
        /// <returns></returns>
        public static string ValidarSeleccionItems(CheckedListBox clb, string campo)
        {
            bool flag = false;

            for (int i = 0; i < clb.Items.Count; i++)
            {
                if (clb.GetItemChecked(i))
                {
                    flag = true;
                    break;
                }
            }

            if (!flag)
            {
                return string.Format("Debe seleccionar el menos un {0}. \n", campo);
            }
            return string.Empty;
        }

        public static string RetornaParametrosConfiguracion(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }

    }


}
